#ifndef JOINT_SPACE_SMOOTH
#define JOINT_SPACE_SMOOTH
#include <vector>
#include <string>
/**
 * @brief 机器人配置参数 
 * @param dh dh参数
 * @param base_offset 安装角度
 * @param user_offset 当前用户坐标系
 * @param tool_offset 当前工具坐标系
 */
typedef struct
{
    int robot_fulldhcom;
    int robot_series;  // 0: Zu series, 1: Co series, 2: Atom
    double dh[4*9];
    double base_offset[3];
    double user_offset[6];
    double tool_offset[6];
    double joint_offset[9];
} RobotSettings;

typedef struct
{
    double jointpos[6];
    double cartpos[6];
} PosType;

typedef struct
{
    double coefsq1[4];
    double coefsq2[4];
    double coefsq3[4];
    double coefsq4[4];
    double coefsq5[4];
    double coefsq6[4];
    double breaks;
} CoefsSaving;

typedef struct
{
    int filtertype;
    double p;
    double incycle;
} FilterParamType;

// --PosType 拟采用关节空间坐标
// --FilterParamType 内部支持滤波类型选择，0为csaps滤波， 其他Reserve； 支持拟合系数P设置； 支持指令间周期设置；
int Filter(const std::vector<PosType>& input, std::vector<PosType>& output, FilterParamType& filter_param);

/**
 * @brief 逆解参考解空间 
 * @param joint_pos 关节坐标
 */
// typedef struct
// {
//     double joint_pos[6];
// } RefJointPos;

#ifdef __cplusplus
extern "C" {
#endif

/**
	 * @brief 设置机器人配置参数
	 * @param robot_setting 机器人参数
	 */
int synch_robot_settings(RobotSettings* robot_setting);

/**
	 * @brief 该函数用于将用户给定的笛卡尔空间离散点，经过平滑处理后生成可执行的脚本程序
	 * @param path_to_raw_waypoint 用户给定的原始路径点文件路径，原始文件需满足一定格式要求
	 * @param path_to_generated_script 经平滑处理后生成的脚本程序路径
	 * @param syn_vel 用户设置的期望末端速度
	 * @param syn_acc 用户设置的期望末端加速度
	 * @param smooth_coef 路径平滑控制系数，取值在[0,1],1表示会经过个点
	 * @param sparse_para  稀疏参数，表示每sparse_para个点取一个点
	 * @param ref_joint_pos  参考解空间
	 * @return errno_t 返回错误码，正常返回为0，其他错误：-1失败，...
	 */
int generate_traj_script(const char* path_to_raw_waypoint,
                         const char* path_to_generated_script,
                         const double syn_vel,
                         const double syn_acc,
                         const double smooth_coef,
                         const int sparse_para,
                         double* ref_joint_pos);

/**
	 * @brief 该函数用于将用户给定的关节空间离散点，经过平滑处理后生成可执行的脚本程序
	 * @param path_to_raw_waypoint 用户给定的原始路径点文件路径，原始文件需满足一定格式要求
	 * @param path_to_generated_script 经平滑处理后生成的脚本程序路径
	 * @param syn_vel 用户设置的期望末端速度
	 * @param syn_acc 用户设置的期望末端加速度
	 * @param smooth_coef 路径平滑控制系数，取值在[0,1],1表示会经过个点
	 * @param sparse_para  稀疏参数，表示每sparse_para个点取一个点
	 * @return errno_t 返回错误码，正常返回为0，其他错误：-1失败，...
	 */
int generate_traj_script_joint(const char* path_to_raw_waypoint,
                               const char* path_to_generated_script,
                               const double syn_vel,
                               const double syn_acc,
                               const double smooth_coef,
                               const int sparse_para);

/*
	*@brief 该函数用于版本管理
	*/
std::string get_version();

#ifdef __cplusplus
}
#endif

#endif